package com.example.file.readwrite;

import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.util.concurrent.TimeUnit;

/**
 * @Author: sn
 * @Desc something
 * @Date: 2021/9/14
 */
public class Test2 {

    public static void main(String[] args) throws Exception {
        // 预分配文件所占的磁盘空间，磁盘中会创建一个指定大小的文件
       /*RandomAccessFile raf = new RandomAccessFile("D://abc.txt", "rw");
        raf.setLength(1024*1024); // 预分配 1M 的文件空间
        raf.close();*/

        // 所要写入的文件内容
        String s1 = "the 1 string";
        String s2 = "the 2 string";
        String s3 = "the 3 string";
        String s4 = "the 4 string";
        String s5 = "the 5 string";
        System.out.println("start:"+System.currentTimeMillis());
        // 利用多线程同时写入一个文件
        new FileWriteThread(0,s1.getBytes()).start(); // 从文件的1024字节之后开始写入数据
        //new FileWriteThread(12,s2.getBytes()).start(); // 从文件的2048字节之后开始写入数据
        new FileWriteThread(24,s3.getBytes()).start(); // 从文件的3072字节之后开始写入数据
        new FileWriteThread(36,s4.getBytes()).start(); // 从文件的4096字节之后开始写入数据
        new FileWriteThread(48,s5.getBytes()).start(); // 从文件的5120字节之后开始写入数据
        new FileWriteThread(12,s2.getBytes()).start(); // 从文件的2048字节之后开始写入数据
        System.out.println("end:"+System.currentTimeMillis());
    }

    // 利用线程在文件的指定位置写入指定数据
    static class FileWriteThread extends Thread{
        private int skip;
        private byte[] content;

        public FileWriteThread(int skip,byte[] content){
            this.skip = skip;
            this.content = content;
        }

        @Override
        public void run(){
            RandomAccessFile raf = null;
            try {
                raf = new RandomAccessFile("D://abc.txt", "rw");
                raf.seek(skip);
                TimeUnit.SECONDS.sleep(2);
                raf.write(content);
                System.out.println(System.currentTimeMillis());
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (InterruptedException e) {
                e.printStackTrace();
            } finally {
                try {
                    raf.close();
                } catch (Exception e) {
                }
            }
        }
    }
}
